///*******************************************************************************
// * Copyright (c) 2004, 2010 IBM Corporation and others.
// * All rights reserved. This program and the accompanying materials
// * are made available under the terms of the Eclipse Public License v1.0
// * which accompanies this distribution, and is available at
// * http://www.eclipse.org/legal/epl-v10.html
// *
// * Contributors:
// *     IBM Corporation - initial API and implementation
// *******************************************************************************/
//package org.eclipse.ui.tests.api;
//
//import junit.framework.TestSuite;
//
//import org.eclipse.core.resources.IFile;
//import org.eclipse.core.resources.IProject;
//import org.eclipse.jface.action.IContributionItem;
//import org.eclipse.jface.preference.IPreferenceStore;
//import org.eclipse.swt.widgets.Menu;
//import org.eclipse.swt.widgets.MenuItem;
//import org.eclipse.ui.IEditorPart;
//import org.eclipse.ui.IEditorRegistry;
//import org.eclipse.ui.IPageLayout;
//import org.eclipse.ui.IPerspectiveDescriptor;
//import org.eclipse.ui.IViewPart;
//import org.eclipse.ui.IViewReference;
//import org.eclipse.ui.IWorkbenchPage;
//import org.eclipse.ui.IWorkbenchPartReference;
//import org.eclipse.ui.IWorkbenchPreferenceConstants;
//import org.eclipse.ui.IWorkbenchWindow;
//import org.eclipse.ui.PartInitException;
//import org.eclipse.ui.PlatformUI;
//import org.eclipse.ui.internal.WorkbenchPlugin;
//import org.eclipse.ui.internal.tweaklets.Tweaklets;
//import org.eclipse.ui.internal.util.PrefUtil;
//import org.eclipse.ui.part.FileEditorInput;
//import org.eclipse.ui.tests.harness.util.FileUtil;
//import org.eclipse.ui.tests.harness.util.UITestCase;
//import org.eclipse.ui.tests.helpers.TestFacade;
//import org.eclipse.ui.views.IStickyViewDescriptor;
//
///**
// * @since 3.0
// */
//public class StickyViewTest extends UITestCase {
//
//	/**
//	 * Allow tests to run just in this class.
//	 * @return the TestSuite to run.
//	 */
//	public static TestSuite suite() {
//		return new TestSuite(StickyViewTest.class);
//	}
//
//    private IWorkbenchWindow window;
//
//    private IWorkbenchPage page;
//
//	private TestFacade facade;
//
//    /**
//     * @param testName
//     */
//    public StickyViewTest(String testName) {
//        super(testName);
//    }
//
//    public void testStackPlacementRight() {
//        testStackPlacement("Right");
//    }
//
//    public void testStackPlacementLeft() {
//        testStackPlacement("Left");
//    }
//
//    public void testStackPlacementTop() {
//        testStackPlacement("Top");
//    }
//
//    public void testStackPlacementBottom() {
//        testStackPlacement("Bottom");
//    }
//
//    /**
//     * Tests to ensure that sticky views are opened in the same stack.
//     */
//    private void testStackPlacement(String location) {
//        try {
//            IViewPart part1 = page
//                    .showView("org.eclipse.ui.tests.api.StickyView" + location
//                            + "1");
//            assertNotNull(part1);
//            IViewPart part2 = page
//                    .showView("org.eclipse.ui.tests.api.StickyView" + location
//                            + "2");
//            assertNotNull(part2);
//            IViewPart[] stack = page.getViewStack(part1);
//
//            assertTrue(ViewUtils.findInStack(stack, part1));
//            assertTrue(ViewUtils.findInStack(stack, part2));
//
//        } catch (PartInitException e) {
//            fail(e.getMessage());
//        }
//
//    }
//
//    /**
//     * Tests to ensure that all views in a stack with a known sticky view are also sticky.
//     */
//    public void testStackContents() {
//        try {
//            IViewPart part1 = page
//                    .showView("org.eclipse.ui.tests.api.StickyViewRight1");
//            assertNotNull(part1);
//
//            IViewPart[] stack = page.getViewStack(part1);
//
//            for (int i = 0; i < stack.length; i++) {
//                assertTrue(stack[i].getTitle(), ViewUtils.isSticky(stack[i]));
//            }
//        } catch (PartInitException e) {
//            fail(e.getMessage());
//        }
//    }
//
//    /**
//     * Tests whether the moveable flag is being picked up and honoured
//     * from the XML.
//     */
//    public void testClosableFlag() {
//        //explicit closeable = true
//        testCloseable("org.eclipse.ui.tests.api.StickyViewRight1", true);
//        //explicit closeable = false
//        testCloseable("org.eclipse.ui.tests.api.StickyViewRight2", false);
//        //implicit closeable = true
//        testCloseable("org.eclipse.ui.tests.api.StickyViewLeft1", true);
//    }
//
//    public void testMoveableFlag() {
//        //explicit closeable = true
//        testMoveable("org.eclipse.ui.tests.api.StickyViewRight1", true);
//        //explicit closeable = false
//        testMoveable("org.eclipse.ui.tests.api.StickyViewRight2", false);
//        //implicit closeable = true
//        testMoveable("org.eclipse.ui.tests.api.StickyViewLeft1", true);
//    }
//
//    /**
//     * Tests whether a sticky view with the given id is moveable or not.
//     *
//     * @param id the id
//     * @param expectation the expected moveable state
//     */
//    private void testMoveable(String id, boolean expectation) {
//        try {
//            IViewPart part = page.showView(id);
//            assertNotNull(part);
//            assertTrue(ViewUtils.isSticky(part));
//
//            //tests to ensure that the XML was read correctly
//            IStickyViewDescriptor[] descs = PlatformUI.getWorkbench()
//                    .getViewRegistry().getStickyViews();
//            for (int i = 0; i < descs.length; i++) {
//                if (descs[i].getId().equals(id)) {
//                    assertEquals(expectation, descs[i].isMoveable());
//                }
//            }
//
//            // tests to ensure that the property is being honoured by the perspective
//            assertEquals(expectation, ViewUtils.isMoveable(part));
//        } catch (PartInitException e) {
//            fail(e.getMessage());
//        }
//    }
//
//    /**
//     * Tests whether a sticky view with the given id is closeable or not.
//     *
//     * @param id the id
//     * @param expectation the expected closeable state
//     */
//    private void testCloseable(String id, boolean expectation) {
//        try {
//            IViewPart part = page.showView(id);
//            assertNotNull(part);
//            assertTrue(ViewUtils.isSticky(part));
//
//            //tests to ensure that the XML was read correctly
//            IStickyViewDescriptor[] descs = PlatformUI.getWorkbench()
//                    .getViewRegistry().getStickyViews();
//            for (int i = 0; i < descs.length; i++) {
//                if (descs[i].getId().equals(id)) {
//                    assertEquals(expectation, descs[i].isCloseable());
//                }
//            }
//
//            // tests to ensure that the property is being honoured by the perspective
//            assertEquals(expectation, ViewUtils.isCloseable(part));
//        } catch (PartInitException e) {
//            fail(e.getMessage());
//        }
//    }
//
//    /**
//     * Sticky views should remain after perspective reset.
//     */
//    public void testPerspectiveReset() {
//        try {
//            page.showView("org.eclipse.ui.tests.api.StickyViewRight1");
//            page.resetPerspective();
//            assertNotNull(page
//                    .findView("org.eclipse.ui.tests.api.StickyViewRight1"));
//        } catch (PartInitException e) {
//            fail(e.getMessage());
//        }
//    }
//
//    /**
//     * Tests that a sticky view is opened in successive perspectives.
//     */
//    public void testPerspectiveOpen() {
//        try {
//            page.showView("org.eclipse.ui.tests.api.StickyViewRight1");
//            page.setPerspective(WorkbenchPlugin.getDefault()
//                    .getPerspectiveRegistry().findPerspectiveWithId(
//                            "org.eclipse.ui.tests.api.SessionPerspective"));
//            assertNotNull(page
//                    .findView("org.eclipse.ui.tests.api.StickyViewRight1"));
//        } catch (PartInitException e) {
//            fail(e.getMessage());
//        }
//    }
//
//    /**
//     * Test that closing a stand-alone view remove the editor stack and
//     * doesn't throw an NPE.
//     *
//     * @throws Throwable on error
//     * @since 3.2
//     */
//    public void testPerspectiveCloseStandaloneView() throws Throwable {
//		page.setPerspective(WorkbenchPlugin.getDefault()
//				.getPerspectiveRegistry().findPerspectiveWithId(
//						PerspectiveViewsBug120934.PERSP_ID));
//
//		try {
//			// find the stand-alone view
//			IViewReference standAloneRef = page
//					.findViewReference(IPageLayout.ID_OUTLINE);
//
//			page.hideView(standAloneRef);
//		} finally {
//			page.closePerspective(page.getPerspective(), false, false);
//		}
//    }
//
//	/**
//	 * Test that a view marked as non-closable cannot be closed as a fast view.
//	 *
//	 * @throws Throwable
//	 * @since 3.1.1
//	 */
//	public void testPerspectiveCloseFastView() throws Throwable {
//		page.setPerspective(WorkbenchPlugin.getDefault()
//				.getPerspectiveRegistry().findPerspectiveWithId(
//						PerspectiveViewsBug88345.PERSP_ID));
//
//		try {
//			// the non-closeable view
//			IViewReference stickyRef = page
//					.findViewReference(MockViewPart.IDMULT);
//			IViewPart stickyView = (IViewPart) stickyRef.getPart(true);
//			page.activate(stickyView);
//
//			IViewReference viewRef = page
//					.findViewReference(PerspectiveViewsBug88345.NORMAL_VIEW_ID);
//
//			assertFalse(facade.isFastView(page, stickyRef));
//
//			facade.addFastView(page, stickyRef);
//			assertTrue(facade.isFastView(page, stickyRef));
//
//			facade.addFastView(page, viewRef);
//			assertTrue(facade.isFastView(page, viewRef));
//
//
//
//			IContributionItem menuContribution = facade.getFVBContribution(page);
//
//			// set the target of a normal view that is now a fast view
//			// close should be enabled
//			facade.setFVBTarget(menuContribution, viewRef);
//			checkEnabledMenuItem(page, menuContribution, "Close", true);
//
//			// set the target of our non-closeable fast view
//			// close should not be enabled
//			facade.setFVBTarget(menuContribution, stickyRef);
//			checkEnabledMenuItem(page, menuContribution, "Close", false);
//		} finally {
//			page.closePerspective(page.getPerspective(), false, false);
//		}
//	}
//
//	/**
//	 * Test that a fast view marked as non-moveable cannot be docked.
//	 *
//	 * @throws Throwable
//	 * @since 3.1.1
//	 */
//	public void testPerspectiveMoveFastView() throws Throwable {
//		page.setPerspective(WorkbenchPlugin.getDefault()
//				.getPerspectiveRegistry().findPerspectiveWithId(
//						PerspectiveViewsBug88345.PERSP_ID));
//
//		try {
//			// the non-moveable view
//			IViewReference stickyRef = page
//					.findViewReference(MockViewPart.IDMULT, "1");
//
//			IViewReference viewRef = page
//					.findViewReference(PerspectiveViewsBug88345.NORMAL_VIEW_ID);
//
//			assertFalse(facade.isFastView(page, viewRef));
//			assertTrue(facade.isFastView(page, stickyRef));
//
//			facade.addFastView(page, viewRef);
//			assertTrue(facade.isFastView(page, viewRef));
//
//			IContributionItem menuContribution = facade.getFVBContribution(page);
//
//			// set the target of a normal view that is now a fast view
//			// Fast View should be enabled
//			facade.setFVBTarget(menuContribution, viewRef);
//			checkEnabledMenuItem(page, menuContribution, "Fast View", true);
//
//			// set the target of our non-closeable fast view
//			// Fast View should not be enabled
//			facade.setFVBTarget(menuContribution, stickyRef);
//			checkEnabledMenuItem(page, menuContribution, "Fast View", false);
//		} finally {
//			page.closePerspective(page.getPerspective(), false, false);
//		}
//	}
//
//	/**
//	 * Find the supplied menu item and make sure it's enabled/disabled.
//	 *
//	 * @param wpage the workbench page
//	 * @param menuContribution the fast bar menu contribution item
//	 * @param isEnabled should the item be enabled
//	 * @since 3.1.1
//	 */
//	private void checkEnabledMenuItem(IWorkbenchPage wpage,
//			IContributionItem menuContribution,
//			String itemName,
//			boolean isEnabled) {
//		Menu m = new Menu(wpage.getWorkbenchWindow().getShell());
//		try {
//			menuContribution.fill(m, 0);
//			MenuItem[] items = m.getItems();
//			MenuItem checkItem = null;
//			for (int i = 0; i < items.length; i++) {
//				MenuItem item = items[i];
//				if (item.getText().indexOf(itemName) >= 0) {
//					checkItem = item;
//				}
//			}
//			assertNotNull(checkItem);
//			assertEquals(isEnabled, checkItem.isEnabled());
//		} finally {
//			menuContribution.dispose();
//			m.dispose();
//		}
//	}
//
//	/**
//	 * Test that the view toolbar visibility matches the presentation
//	 * visibility for a view.
//	 *
//	 * @throws Throwable on an error
//	 * @since 3.2
//	 */
//	public void testPerspectiveViewToolBarVisible() throws Throwable {
//		// These tests are hard-wired to the pre-3.3 zoom behaviour
//		// Run them anyway to ensure that we preserve the 3.0 mechanism
//        IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore();
//        boolean oldMinMaxState = apiStore.getBoolean(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX);
//		apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, false);
//
//		IPerspectiveDescriptor perspective = WorkbenchPlugin.getDefault()
//				.getPerspectiveRegistry().findPerspectiveWithId(
//						PerspectiveViewsBug88345.PERSP_ID);
//		page.setPerspective(perspective);
//
//		IEditorPart editor = null;
//		IEditorRegistry registry = window.getWorkbench().getEditorRegistry();
//		IPerspectiveDescriptor secondPerspective = WorkbenchPlugin.getDefault()
//				.getPerspectiveRegistry().findPerspectiveWithId(
//						SessionPerspective.ID);
//		try {
//			// a view with it's toolbar on the line below the tab
//			page.showView(PerspectiveViewsBug88345.PROP_SHEET_ID);
//			IViewReference viewRef = page
//					.findViewReference(PerspectiveViewsBug88345.PROP_SHEET_ID);
//
//			IProject proj = FileUtil.createProject("TBTest");
//			IFile test01 = FileUtil.createFile("test01.txt", proj);
//
//			// make sure the view is active
//			assertNotNull("The view must exist", viewRef.getPart(true));
//			page.activate(viewRef.getPart(true));
//
//
//			assertTrue(facade.isViewPaneVisible(viewRef));
//			assertTrue(facade.isViewToolbarVisible(viewRef));
//
//			// open the editor and zoom it.
//			editor = page.openEditor(new FileEditorInput(test01), registry
//					.getDefaultEditor(test01.getName()).getId());
//			assertNotNull("must have my editor", editor);
//
//			IWorkbenchPartReference ref = page.getReference(editor);
//			page.toggleZoom(ref);
//			assertFalse(facade.isViewPaneVisible(viewRef));
//			assertFalse(facade.isViewToolbarVisible(viewRef));
//
//			// switch to another perspective, and then switch back.
//			page.setPerspective(secondPerspective);
//
//			assertFalse(facade.isViewPaneVisible(viewRef));
//			assertFalse(facade.isViewToolbarVisible(viewRef));
//
//			page.setPerspective(perspective);
//			processEvents();
//
//			// both the view and the toolbar must be not visible
//			assertFalse(facade.isViewPaneVisible(viewRef));
//			assertFalse(facade.isViewToolbarVisible(viewRef));
//
//		} finally {
//			if (editor != null) {
//				page.closeEditor(editor, false);
//			}
//			page.closePerspective(perspective, false, false);
//			page.closePerspective(secondPerspective, false, false);
//
//			// Restore the min/max state to it's correct value
//			apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, oldMinMaxState);
//		}
//	}
//
//    /*
//	 * (non-Javadoc)
//	 *
//	 * @see org.eclipse.ui.tests.util.UITestCase#doSetUp()
//	 */
//    protected void doSetUp() throws Exception {
//        window = openTestWindow();
//        page = window.getActivePage();
//        facade = (TestFacade) Tweaklets.get(TestFacade.KEY);
//    }
//}
